package com.edu.exam.enums.examination.security;

/**
 * 认证方法枚举
 *
 * 从SessionSecurity.AuthMethod迁移而来
 * 定义考试系统中支持的各种认证方法，用于用户身份验证
 *
 * @author System
 * @version 1.0.0
 */
public enum AuthenticationMethod {

    /**
     * 用户名密码认证 - 最基本的认证方式
     */
    USERNAME_PASSWORD("USERNAME_PASSWORD", "用户名密码"),

    /**
     * 短信验证码认证 - 通过手机短信验证码进行认证
     */
    SMS_VERIFICATION("SMS_VERIFICATION", "短信验证码"),

    /**
     * 邮箱验证码认证 - 通过邮箱验证码进行认证
     */
    EMAIL_VERIFICATION("EMAIL_VERIFICATION", "邮箱验证码"),

    /**
     * 人脸识别认证 - 通过人脸识别技术进行认证
     */
    FACE_RECOGNITION("FACE_RECOGNITION", "人脸识别"),

    /**
     * 指纹识别认证 - 通过指纹识别技术进行认证
     */
    FINGERPRINT("FINGERPRINT", "指纹识别"),

    /**
     * 声纹识别认证 - 通过声音识别技术进行认证
     */
    VOICE_RECOGNITION("VOICE_RECOGNITION", "声纹识别"),

    /**
     * 身份证认证 - 通过身份证信息进行认证
     */
    ID_CARD("ID_CARD", "身份证认证"),

    /**
     * 学生证认证 - 通过学生证信息进行认证
     */
    STUDENT_CARD("STUDENT_CARD", "学生证认证"),

    /**
     * 一次性密码认证 - 通过OTP令牌进行认证
     */
    ONE_TIME_PASSWORD("ONE_TIME_PASSWORD", "一次性密码"),

    /**
     * 数字证书认证 - 通过数字证书进行认证
     */
    DIGITAL_CERTIFICATE("DIGITAL_CERTIFICATE", "数字证书"),

    /**
     * 生物特征多因素认证 - 结合多种生物特征的认证方式
     */
    BIOMETRIC_MULTI_FACTOR("BIOMETRIC_MULTI_FACTOR", "生物特征多因素"),

    /**
     * 知识因子认证 - 基于个人知识的认证方式
     */
    KNOWLEDGE_FACTOR("KNOWLEDGE_FACTOR", "知识因子"),

    /**
     * 拥有因子认证 - 基于用户拥有的设备或令牌的认证方式
     */
    POSSESSION_FACTOR("POSSESSION_FACTOR", "拥有因子"),

    /**
     * 内置因子认证 - 基于用户固有特征的认证方式
     */
    INHERENCE_FACTOR("INHERENCE_FACTOR", "内置因子"),

    /**
     * 动态令牌认证 - 基于时间或事件同步的动态令牌认证
     */
    DYNAMIC_TOKEN("DYNAMIC_TOKEN", "动态令牌"),

    /**
     * 静态令牌认证 - 基于预共享的静态令牌认证
     */
    STATIC_TOKEN("STATIC_TOKEN", "静态令牌"),

    /**
     * 智能卡认证 - 通过智能卡进行认证
     */
    SMART_CARD("SMART_CARD", "智能卡"),

    /**
     * USB Key认证 - 通过USB Key进行认证
     */
    USB_KEY("USB_KEY", "USB Key"),

    /**
     * 无认证 - 无需认证的特殊情况
     */
    NO_AUTHENTICATION("NO_AUTHENTICATION", "无认证");

    private final String code;
    private final String description;

    AuthenticationMethod(String code, String description) {
        this.code = code;
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 根据编码获取对应的枚举
     *
     * @param code 编码
     * @return 对应的枚举
     */
    public static AuthenticationMethod fromCode(String code) {
        for (AuthenticationMethod method : values()) {
            if (method.getCode().equals(code)) {
                return method;
            }
        }
        throw new IllegalArgumentException("Unknown authentication method code: " + code);
    }

    /**
     * 根据描述获取对应的枚举
     *
     * @param description 描述
     * @return 对应的枚举
     */
    @Override
    public String toString() {
        return description;
    }
}
